---
id: lab4-intro
slug: /labs/lab4
sidebar_position: 1
---

# 4. Нахождение корней нелинейного уравнения

Алиас: `3 метода`.

## Цель работы

- программирование численных методов решения нелинейных уравнений;
- сравнительный анализ методов простой итерации, половинного деления и метода Ньютона.

## Задание

1. Найти корень уравнения $x - \cos(x) = 0$ *простой итерацией* (метод №1), *половинным делением* (метод №2) и *методом Ньютона* (метод №3) с погрешностью $eps < 0.000001$ и для каждого из трех методов определить количество шагов алгоритма.
2. Выполнить п.1 для $eps < 0.00000001$.
3. Выполнить п.1 для уравнения $x - k*\cos(x) = 0$ для $k = 5$ и $k = 10$ и объяснить результаты.

Результат представить в виде таблицы (без рамок), которая содержит три столбца `№ метода`, `x` и `N`, где `N` - количество итераций.

**Ширина столбца**: `16` символов.

:::caution

Последний столбец пробелами не заполняется!

:::

**Требуемая точность**: `8` знаков после запятой

## Пример вывода в консоли

```bash
Уравнение: x - cos(x) = 0. Погрешность: 0.000001
№ метода        x               N
1               0.00000000      0
2               0.00000000      0
3               0.00000000      0

Уравнение: x - cos(x) = 0. Погрешность: 0.00000001
№ метода        x               N
1               0.00000000      0
2               0.00000000      0
3               0.00000000      0

Уравнение: x - k * cos(x) = 0, k = 5. Погрешность: 0.000001
№ метода        x               N
1               0.00000000      0
2               0.00000000      0
3               0.00000000      0

Уравнение: x - k  * cos(x) = 0, k = 10. Погрешность: 0.000001
№ метода        x               N
1               0.00000000      0
2               0.00000000      0
3               0.00000000      0
```

## Указания по выполнению работы

:::danger

Методы нахождения корней нелинейного уравнения требуется оформить в виде функций. В случае игнорирования данного требования, код будет отправлен на доработку.

:::

Численному решению уравнения

$$
f(x) = 0 \quad (1)
$$

должно предшествовать хотя бы грубое исследование вопросов существования и положения корней.

### Итерационные методы

Заданное уравнение $f(x) = 0$ приводят к виду

$$
x = \varphi(x) \quad (2)
$$

Выбирая некоторое начальное приближение $X_0$,  вычисляют последовательные приближения

$$
X_{j+1} = \varphi(X_j),\quad (j = 0, 1, 2, ...)
$$

Сходимость таких приближений к искомому решению $X$ требует отдельного исследования. Сходимость зависит прежде всего от вида функции, а также от начального приближения. В данной лабораторной работе такие исследования не делаются, но в пункте 3 задания приведена функция, для которой решения методом Ньютона и методом простой итерации расходятся. Для того, чтобы программа нахождения корней этими методами не зацикливалась, следует ограничивать максимальное число итераций $N_{max}$.

:::caution

Для выполнения задания использовать $N_{max} < 100000$. В противном случае ваша программа при тестировании будет останавливаться по таймауту, а тест будет считаться провалившимся.

:::

Возможны различные способы приведения уравнения $(1)$ к виду $(2)$.

#### Простая итерация

$$
X_{j+1} = X_j - f(X_j).
$$

#### Метод Ньютона

$$
X_{j+1} = X_j - f(X_j)/ f'(X_j).
$$

### Метод половинного деления

Для использования этого метода нужно задать границы интервала на оси абсцисс, содержащего ровно один корень $[xl, xr]$ и требуемую точность вычислений.

Суть метода заключается в следующем. Выбирают $X$ на середине интервала $[xl, xr]$ и определяют $f(X)$. Если  $f(X) < eps$, то середина интервала считается корнем функции, иначе корень ищется на том интервале из двух полученных, для которого значения функции на концах имеют разные знаки.

## Проверка задания

Подготовленная программа для решения задания проверяется вручную преподавателем (визуальный контроль).

## Методический материал

1. [Требования к отчету](RequirementsForReport.md)
2. Контрольные вопросы:
   1. [Для потока на С](TestQuestion/ForC.md)
   2. [Для потока на С++](TestQuestion/ForCpp.md)
